今天我們只要再新增四個節點就能完成「關鍵字搜索」這個功能了,讓我們接著做下去吧~
增加一個 Code(篩選新聞)
節點,並輸入以下程式碼:
const items = $input.all();
const keyword = items[0]?.json.keyword || null;
const results = [];
if (!keyword) {
return [{ json: { keyword: "未設定關鍵字", results: [] } }];
}
for (const item of items) {
const content = item.json.cleanedContent || "";
if (content.toLowerCase().includes(keyword.toLowerCase())) {
results.push(item.json);
}
}
return [{ json: { keyword, results } }];
這段程式碼的重點是:
keyword
欄位是否存在,如果沒有設定關鍵字,程式會直接回傳一個包含「未設定關鍵字」訊息的結果。關於第一點我要再說明一下,你可能會想說:「前面明明有用一個 If
節點來判斷使用者輸入的內容是否有關鍵字了,為什麼這裡還要再打這行程式碼?」
(如果你忘了是哪個節點,偷偷提示一下圖片)
雖然我們在這個節點就已經有先判斷過使用者是否輸入正確格式,確認有關鍵字,但是有可能 keyword
這個欄位在傳遞結果途中的某處消失了,或是我們在更改前面的節點內容時沒注意到,導致 keyword
這個欄位根本沒產生,所以我們要加上一層保險,這樣執行工作流時能更清楚知道哪裡有什麼問題。
在剛剛的 Code(篩選新聞)
節點後面連接一個 Code(搜索結果)
節點,輸入以下程式碼:
const { results: items, keyword } = $input.first().json;
let messages = [];
if (!items?.length) {
messages.push({ type: "text", text: `❌ 沒有找到包含「${keyword}」的新聞喔~` });
} else {
const combinedText = `以下是訂閱主題中包含「${keyword}」的新聞\n\n` +
items.map(item => `📰 ${item.title}\n🔗 ${item.link}`).join('\n\n');
messages.push({
type: "text",
text: combinedText.slice(0, 1000) // LINE 單則訊息最多 1000 字
});
}
return [{ json: { replyToken: $input.first().json.replyToken, messages } }];
return [{
json: {
replyToken: $input.first().json.replyToken,
messages: messages
}
}];
這段程式碼的重點是:
${keyword}
』的新聞喔~」這則訊息。combinedText.slice(0, 1000)
確保訊息不會超過字數上限,如果超過字數上限,超過字數限制的訊息就會被自動截斷,接收者只能看到截斷後的部分,但通常關鍵字很少會 20 則新聞都符合吧!所以這點不太需要擔心。return
Bot 實際回覆給使用者的訊息。在 Code(搜索結果)
節點 後面連接一個 HTTP Request 節點
,這個節點想必你已經非常熟悉了,我就不多說明,設定都和之前功能相同為 LINE 回覆訊息的一樣。
剩下最後一個節點!我們要把兩天前建立的 Code(keyword)
節點和昨天新增的 Code(html)
節點 當成 Merge
節點的 Input,把 Code(keyword)
和 Code(html)
節點的輸出結果都輸入進去並輸出給 Code(篩選新聞)
節點,這麼做的原因是:
RSS Read
和HTTP Request
節點不會輸出keyword
欄位,所以雖然我們在Code(keyword)
節點有輸出keyword
欄位,但執行到RSS Read
和HTTP Request
節點時它就會消失了。
因為如此,我們需要用一個 Merge
節點來把 Code(keyword)
節點輸出的 keyword
欄位留下來。
完整的關鍵字搜索工作流如下圖所示:
這樣就成功做完關鍵字搜索這個功能啦~恭喜你又完成了一項任務,辛苦了!
明天(Day 21)我們要開始做新功能,會先從 LINE 後台建立主題選單開始!